package com.liuyc.lib.tools.ext

import android.view.View
import com.liuyc.lib.tools.R


/**
 * view 防止重复点击
 * 原理：
 * 通过 扩展函数 对 view 的setTag 设置 重复间隔时间 以及 上次点击的时间
 * 在通过 高阶函数 用来替代view 的 setOnClickListener 其内是实现了 setOnClickListener
 * 来实现防止重复点击事件
 * 刘隽
 */

/**
 * 设置view 的扩展函数将 点击时间设置到tag中
 */
private var <T : View> T.triggerLastTime: Long
    get() = if (getTag(R.id.liuyc_id_triggerLastTimeKey) != null) getTag(R.id.liuyc_id_triggerLastTimeKey) as Long else 0L
    set(value) {
        setTag(R.id.liuyc_id_triggerLastTimeKey, value)
    }

/**
 * 设置view 的扩展函数将  设置 重复点击间隔时间
 */
private var <T : View> T.triggerDelay: Long
    get() = if (getTag(R.id.liuyc_id_triggerDelayKey) != null) getTag(R.id.liuyc_id_triggerDelayKey) as Long else 0L
    set(value) {
        setTag(R.id.liuyc_id_triggerDelayKey, value)
    }

/**
 * 判断当前 view 是否可以点击
 */
private fun <T : View> T.clickEnable(): Boolean {

    //时候可以点击
    var clickable = false

    val currentClickTime = System.currentTimeMillis()
    //判断点击是否超出间隔时间
    if (currentClickTime - triggerLastTime >= triggerDelay) clickable = true

    triggerLastTime = currentClickTime

    return clickable

}

/**
 *  替代 普通 的点击事件
 */
fun <T : View> T.click(block: (T) -> Unit) = setOnClickListener {
    if (clickEnable())
    block(it as T)
}

/**
 * 设置重复点击 间隔时间 可以这样 使用 view.withTrigger().click{...} 来实现点击
 */
fun <T : View> T.withTrigger(delay: Long = 600): T {
    triggerDelay = delay
    return this
}

/**
 *  防止 重复点击事件
 */
fun <T : View> T.clickWithTrigger(delay: Long = 600, block: (T) -> Unit) {
    withTrigger(delay).click { block(this) }
}